原始题目:剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 (opens new window)

解题思路:

可以仿照快速排序中 partitionpartition 操作的思路,使用两个指针 ll, rr

  • ll 指向的是奇数时,ll 自增;

  • rr 指向的是偶数时,rr 自减;

  • llrr 指向的元素交换。

循环上面的操作,直到 l==rl == r

代码:

public int[] exchange(int[] nums) {
    if (nums == null || nums.length == 0) {
        return new int[0];
    }
    int l = 0, r = nums.length - 1;
    while (l < r) {
        while (l < r && (nums[l] & 1) == 1) {
            l++;
        }
        while (l < r && (nums[r] & 1) == 0) {
            r--;
        }
        swap(nums, l, r);
    }
    return nums;
}

private void swap(int[] nums, int i, int j) {
    int tmp = nums[i];
    nums[i] = nums[j];
    nums[j] = tmp;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

复杂度分析

  • 时间复杂度O(N)O(N):需要遍历 N 个元素。

  • 空间复杂度O(1)O(1)llrr 都是常数级的额外空间。

上次更新: 2023/10/15